* GSS analysis for: 
* Class, Policy Attitudes and U.S. Presidential Voting in the Post-Industrial Era: The Importance of Issue Salience
* Franko & Witko
* Political Research Quarterly
* Date: 05/25/22


*******************************************************************************
* Descriptive statistics.
*******************************************************************************

set more off

tabstat culpol01, by(year)
sum culpol01 subclass ibn.egp5 inc5 edu5 pid7 polviews white age female south demvote, separator(0)


*******************************************************************************
* Culture policy index based on abortion and LGBTQ rights.
* Pooled models.
*******************************************************************************

* Create new frame to save results.
frame create cultgss_diffs
frame cultgss_diffs { 
	input 	str10 var diff ll ul str10 sample
		"egp1.5" . . . "All"
		"egp2.5" . . . "All"
		"inc5" . . . "All"
		"edu5" . . . "All"
		"white" . . . "All"
		"subclass" . . . "All"
		"egp1.5" . . . "White"
		"egp2.5" . . . "White"
		"inc5" . . . "White"
		"edu5" . . . "White"
		"subclass" . . . "White"
		"egp1.5" . . . "Nonwhite"
		"egp2.5" . . . "Nonwhite"
		"inc5" . . . "Nonwhite"
		"edu5" . . . "Nonwhite"
		"subclass" . . . "Nonwhite"
	end
}

* Create separate frame for PID results.
frame create cultgss_diffs_pid7
frame cultgss_diffs_pid7 { 
	input 	str10 var diff ll ul str10 sample
		"pid7" . . . "All"
		"pid7" . . . "White"
		"pid7" . . . "Nonwhite"
	end
}



*******************************************************************************
* Full sample.
*******************************************************************************

local varlst1 "pid7 polviews white age female south"

foreach v in b5.egp5 inc5 edu5 subclass {
	if "`v'" == "b5.egp5" {
		mixed culpol01 `v' `varlst1' || year: , reml
		estimates store cultgss_egp5_all
		margins , at(egp5=5) at(egp5=1) post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs { 
			replace diff = r(estimate) if var == "egp1.5" & sample == "All"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp1.5" & sample == "All"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp1.5" & sample == "All"
		}
		estimates restore cultgss_egp5_all
		margins , at(egp5=5) at(egp5=2) post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs {
			replace diff = r(estimate) if var == "egp2.5" & sample == "All"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp2.5" & sample == "All"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp2.5" & sample == "All"
		}
	}
	else {
		mixed culpol01 `v' `varlst1' || year: , reml
		estimates store cultgss_`v'_all
		margins , at((p5) `v') at((p95) `v') post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs { 
			replace diff = r(estimate) if var == "`v'" & sample == "All"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "`v'" & sample == "All"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "`v'" & sample == "All"
		}
	}
}

* Full sample, race without class covariates.
mixed culpol01 `varlst1' || year: , reml
estimates store cultgss_white_all
* Difference for white/non-white.
margins , at(white=0) at(white=1) post
lincom _b[1._at] - _b[2._at]
frame cultgss_diffs {
	replace diff = r(estimate) if var == "white" & sample == "All"
	replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "white" & sample == "All"
	replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "white" & sample == "All"
}

* Use same model for pid difference.
estimates restore cultgss_white_all
margins , at((p5) pid7) at((p95) pid7) post
lincom _b[1._at] - _b[2._at]
frame cultgss_diffs_pid7 {
	replace diff = r(estimate) if var == "pid7" & sample == "All"
	replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "pid7" & sample == "All"
	replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "pid7" & sample == "All"
}


* Full sample, include all covariates.
mixed culpol01 b5.egp5 inc5 edu5 subclass `varlst1' || year: , reml
estimates store cultgss_full_all



*******************************************************************************
* Repeat above analysis for white only subsample.
*******************************************************************************

local varlst2 "pid7 polviews age female south"

foreach v in b5.egp5 inc5 edu5 subclass {
	if "`v'" == "b5.egp5" {
		mixed culpol01 `v' `varlst2' || year: if white==1 , reml
		estimates store cultgss_egp5_wo
		margins , at(egp5=5) at(egp5=1) post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs { 
			replace diff = r(estimate) if var == "egp1.5" & sample == "White"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp1.5" & sample == "White"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp1.5" & sample == "White"
		}
		estimates restore cultgss_egp5_wo
		margins , at(egp5=5) at(egp5=2) post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs {
			replace diff = r(estimate) if var == "egp2.5" & sample == "White"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp2.5" & sample == "White"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp2.5" & sample == "White"
		}
	}
	else {
		mixed culpol01 `v' `varlst2' || year: if white==1 , reml
		estimates store cultgss_`v'_wo
		margins , at((p5) `v') at((p95) `v') post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs { 
			replace diff = r(estimate) if var == "`v'" & sample == "White"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "`v'" & sample == "White"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "`v'" & sample == "White"
		}
	}
}


* White only subsample, pid without class covariates.
mixed culpol01 `varlst2' || year: if white==1 , reml
estimates store cultgss_pid7_wo
margins , at((p5) pid7) at((p95) pid7) post
lincom _b[1._at] - _b[2._at]
frame cultgss_diffs_pid7 {
	replace diff = r(estimate) if var == "pid7" & sample == "White"
	replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "pid7" & sample == "White"
	replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "pid7" & sample == "White"
}


* White only subsample, include all covariates.
mixed culpol01 b5.egp5 inc5 edu5 subclass `varlst2' || year: if white==1 , reml
estimates store cultgss_full_wo



*******************************************************************************
* Repeat above analysis for nonwhite subsample.
*******************************************************************************

local varlst2 "pid7 polviews age female south"

foreach v in b5.egp5 inc5 edu5 subclass {
	if "`v'" == "b5.egp5" {
		mixed culpol01 `v' `varlst2' || year: if white==0 , reml
		estimates store cultgss_egp5_nwo
		margins , at(egp5=5) at(egp5=1) post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs { 
			replace diff = r(estimate) if var == "egp1.5" & sample == "Nonwhite"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp1.5" & sample == "Nonwhite"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp1.5" & sample == "Nonwhite"
		}
		estimates restore cultgss_egp5_nwo
		margins , at(egp5=5) at(egp5=2) post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs {
			replace diff = r(estimate) if var == "egp2.5" & sample == "Nonwhite"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp2.5" & sample == "Nonwhite"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp2.5" & sample == "Nonwhite"
		}
	}
	else {
		mixed culpol01 `v' `varlst2' || year: if white==0 , reml
		estimates store cultgss_`v'_nwo
		margins , at((p5) `v') at((p95) `v') post
		lincom _b[1._at] - _b[2._at]
		frame cultgss_diffs { 
			replace diff = r(estimate) if var == "`v'" & sample == "Nonwhite"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "`v'" & sample == "Nonwhite"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "`v'" & sample == "Nonwhite"
		}
	}
}


* Nonwhite only subsample, pid without class covariates.
mixed culpol01 `varlst2' || year: if white==0 , reml
estimates store cultgss_pid7_nwo
margins , at((p5) pid7) at((p95) pid7) post
lincom _b[1._at] - _b[2._at]
frame cultgss_diffs_pid7 {
	replace diff = r(estimate) if var == "pid7" & sample == "Nonwhite"
	replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "pid7" & sample == "Nonwhite"
	replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "pid7" & sample == "Nonwhite"
}


* Nonwhite only subsample, include all covariates.
mixed culpol01 b5.egp5 inc5 edu5 subclass `varlst2' || year: if white==0 , reml
estimates store cultgss_full_nwo


***** Save Min/max difference results.
frame cultgss_diffs : save "results/cultgss_diffs.dta", replace
frame cultgss_diffs_pid7 : save "results/cultgss_diffs_pid7.dta", replace



*******************************************************************************
* Culture policy index based on abortion and LGBTQ rights.
* Allow social class coefficients to vary by year, then plot effects over time.
*******************************************************************************

*******************************************************************************
* Full sample.
*******************************************************************************

local varlst1 "pid7 polviews white age female south"

* EGP social class.
mixed culpol01 egp5_1-egp5_4 `varlst1' || year: egp5_1-egp5_4 , reml
estimates store cultgss_egp_time

* Estimated effects: use coefficients.
preserve
gen b_egp = .
gen se_egp = .

predict egp_re* if e(sample), reffects reses(egp_rese*)

foreach n of numlist 1(1)4 {
	replace b_egp = _b[egp5_`n'] + egp_re`n' if egp5_`n' == 1
	replace se_egp = sqrt((_se[egp5_`n']^2) + (egp_rese`n'^2)) if egp5_`n' == 1
}

collapse b_egp se_egp, by(year egp5)
gen b_egp_hi = b_egp + 1.96*se_egp
gen b_egp_lo = b_egp - 1.96*se_egp

drop if b_egp == .

save "results/cultgss_egp5_time.dta", replace
restore


* All other class variables.
foreach v in inc5 edu5 subclass {
	mixed culpol01 `v' `varlst1' || year: `v' , reml
	estimates store cultgss_`v'_time
	* Estimated effects: use coefficients.
	preserve
	predict b_re* if e(sample), reffects reses(b_rese*)

	gen b = _b[`v'] + b_re1
	gen se = sqrt((_se[`v']^2) + (b_rese1^2))

	collapse b se, by(year)
	gen b_hi = b + 1.96*se
	gen b_lo = b - 1.96*se

	drop if b == .
	gen str20 var = "`v'"

	save "results/cultgss_`v'_time.dta", replace
	restore
}



*******************************************************************************
* Whites only subsample.
*******************************************************************************

local varlst2 "pid7 polviews age female south"

* EGP social class.
mixed culpol01 egp5_1-egp5_4 `varlst2' || year: egp5_1-egp5_4 if white == 1 , reml
estimates store cultgss_egp_time_wo

* Estimated effects: use coefficients.
preserve
gen b_egp = .
gen se_egp = .

predict egp_re* if e(sample), reffects reses(egp_rese*)

foreach n of numlist 1(1)4 {
	replace b_egp = _b[egp5_`n'] + egp_re`n' if egp5_`n' == 1
	replace se_egp = sqrt((_se[egp5_`n']^2) + (egp_rese`n'^2)) if egp5_`n' == 1
}

collapse b_egp se_egp, by(year egp5)
gen b_egp_hi = b_egp + 1.96*se_egp
gen b_egp_lo = b_egp - 1.96*se_egp

drop if b_egp == .

save "results/cultgss_egp5_time_wo.dta", replace
restore


* All other class variables.
foreach v in inc5 edu5 subclass {
	mixed culpol01 `v' `varlst2' || year: `v' if white == 1 , reml
	estimates store cultgss_`v'_time_wo
	* Estimated effects: use coefficients.
	preserve
	predict b_re* if e(sample), reffects reses(b_rese*)

	gen b = _b[`v'] + b_re1
	gen se = sqrt((_se[`v']^2) + (b_rese1^2))

	collapse b se, by(year)
	gen b_hi = b + 1.96*se
	gen b_lo = b - 1.96*se

	drop if b == .
	gen str20 var = "`v'"

	save "results/cultgss_`v'_time_wo.dta", replace
	restore
}


